package yunjiao.javatutorials.guava.concurrent;

import com.google.common.util.concurrent.AbstractScheduledService;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

/**
 * 定时数据同步
 *
 * @author yangyunjiao
 */
@Slf4j
public class DataSyncService  extends AbstractScheduledService {
    @Override
    protected void runOneIteration() throws Exception {
        log.info("数据同步开始执行: {}", System.currentTimeMillis()/1000);
        // 执行数据同步逻辑
        syncDataFromExternalSource();
        log.info("数据同步完成: {}", System.currentTimeMillis()/1000);
    }

    @Override
    protected Scheduler scheduler() {
        // 每30秒执行一次，首次延迟5秒
        return Scheduler.newFixedRateSchedule(300, 200, TimeUnit.MILLISECONDS);
    }

    @Override
    protected void startUp() throws Exception {
        log.info("数据同步服务启动");
        // 初始化资源
    }

    @Override
    protected void shutDown() throws Exception {
        log.info("数据同步服务停止");
        // 清理资源
    }

    private void syncDataFromExternalSource() {
        // 实际的数据同步逻辑
        try {
            // 模拟同步操作
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }

    public static void main(String[] args) throws InterruptedException, TimeoutException {
        DataSyncService service = new DataSyncService();

        // 启动服务（异步）
        service.startAsync();
        service.awaitRunning(); // 阻塞等待服务启动成功（进入 RUNNING 状态）
        System.out.println("服务已启动，状态：" + service.state());

        // 运行5秒后停止服务
        TimeUnit.SECONDS.sleep(5);
        service.stopAsync(); // 异步停止
        service.awaitTerminated(3, TimeUnit.SECONDS); // 阻塞等待停止完成（最多等3秒）
        System.out.println("服务已停止，状态：" + service.state());
    }
}
